﻿#include "math.h"
#include "oled.h"
#include "oled_GUI.h"

unsigned char OLED_GRAM[128][8]={0};

/***************************16*16的点阵字体取模方式：共阴——列行式——逆向输出*********/
const unsigned char F16x16[] =
{
    0x00,0x02,0x02,0xFA,0xFA,0xAA,0xAA,0xFF,0xFF,0xAA,0xAA,0xFA,0xFA,0x02,0x02,0x00,
    0x00,0x42,0x72,0x72,0x3A,0x7A,0x42,0x4B,0x5B,0x52,0x62,0x62,0x13,0x77,0x66,0x00,/*"惠",0*/

    0x20,0x3C,0x1C,0xFF,0xFF,0xB0,0xB4,0x24,0x24,0x3F,0x3F,0xE4,0xE4,0x24,0x24,0x20,
    0x02,0x02,0x03,0xFF,0xFF,0x00,0x01,0x05,0x1D,0x59,0xC1,0xFF,0x7F,0x01,0x01,0x01,/*"特",1*/

    0x00,0x00,0x00,0xF8,0xF8,0x48,0x4C,0x4F,0x4B,0x4A,0x48,0x48,0xF8,0xF8,0x00,0x00,
    0x00,0x00,0x00,0xFF,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0xFF,0x00,0x00,/*"自",2*/

    0x20,0x24,0x24,0xE4,0xE4,0x24,0x24,0x24,0x30,0x10,0xFF,0xFF,0x10,0xF0,0xF0,0x00,
    0x08,0x1C,0x1F,0x0B,0x0C,0x0D,0x4F,0x6E,0x34,0x1C,0x0F,0x23,0x60,0x7F,0x3F,0x00,/*"动",3*/

    0x80,0xC0,0x60,0xF8,0xFF,0x07,0x02,0x00,0xFF,0xFF,0xE0,0x70,0x3C,0x1C,0x08,0x00,
    0x00,0x00,0x00,0x7F,0x7F,0x04,0x06,0x03,0x3F,0x7F,0x40,0x40,0x40,0x78,0x78,0x00,/*"化",4*/
};

/***********************************6*8的点阵************************************/
const unsigned char F6x8[][6]=
{
      {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
    },{0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
    },{0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
    },{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
    },{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
    },{0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
    },{0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
    },{0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
    },{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
    },{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
    },{0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
    },{0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
    },{0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
    },{0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
    },{0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
    },{0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
    },{0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
    },{0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
    },{0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
    },{0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
    },{0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
    },{0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
    },{0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
    },{0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
    },{0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
    },{0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
    },{0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
    },{0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
    },{0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
    },{0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
    },{0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
    },{0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
    },{0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
    },{0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
    },{0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
    },{0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
    },{0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
    },{0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
    },{0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
    },{0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
    },{0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
    },{0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
    },{0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
    },{0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
    },{0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
    },{0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
    },{0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
    },{0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
    },{0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
    },{0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
    },{0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
    },{0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
    },{0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
    },{0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
    },{0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
    },{0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
    },{0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
    },{0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
    },{0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
    },{0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
    },{0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
    },{0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
    },{0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
    },{0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
    },{0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
    },{0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
    },{0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
    },{0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
    },{0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
    },{0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
    },{0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
    },{0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
    },{0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
    },{0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
    },{0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
    },{0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
    },{0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
    },{0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
    },{0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
    },{0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
    },{0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
    },{0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
    },{0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
    },{0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
    },{0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
    },{0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
    },{0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
    },{0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
    },{0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
    },{0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
    },{0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
    },{0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
    }
};

/****************************************8*16的点阵************************************/
const unsigned char F8X16[]=
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  0
    0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,// !1
    0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
    0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
    0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
    0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
    0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
    0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
    0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
    0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
    0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
    0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
    0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,// /15
    0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
    0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
    0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
    0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
    0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
    0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
    0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
    0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
    0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
    0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
    0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
    0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
    0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
    0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
    0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
    0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
    0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
    0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
    0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
    0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
    0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
    0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
    0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
    0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
    0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
    0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
    0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
    0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
    0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
    0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
    0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
    0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
    0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
    0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
    0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
    0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
    0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
    0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
    0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
    0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
    0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
    0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
    0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
    0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
    0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
    0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
    0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
    0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
    0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
    0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
    0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
    0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
    0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
    0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
    0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
    0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
    0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
    0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
    0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
    0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
    0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
    0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
    0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
    0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
    0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
    0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
    0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
    0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
    0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
    0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
    0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
    0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
    0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
    0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};

const unsigned char logo[][8]={
    {0x60,0x00,0x40,0x00,0x40,0x00,0x40,0x00},/*"信号1",0*/
    {0x60,0x00,0x70,0x00,0x40,0x00,0x40,0x00},/*"信号2",1*/
    {0x60,0x00,0x70,0x00,0x78,0x00,0x40,0x00},/*"信号3",2*/
    {0x60,0x00,0x70,0x00,0x78,0x00,0x7C,0x00},/*"信号4",3*/

    {0x00,0x20,0x7E,0x00,0x00,0x7E,0x04,0x00},/*"数据",4*/

    {0x00,0x00,0x3C,0x42,0x42,0x52,0x30,0x00},/*"GPRS",5*/
    {0x00,0x18,0x3C,0x7C,0x7C,0x3C,0x18,0x00},/*"小心",6*/
    {0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C},/*"大心",7*/
};


/**************************************/
/**************************************/
//基于内存修改的系列函数
//画点函数：SetSetSetDot_FS_FS_FS():
//							:基于全屏点阵的任意画图和画点，只修改内存中的变量，然后整体画到屏幕上
//							：x,y  坐标
//							：color  :颜色  0：白  1：黑
//边学编写；2016/9/24/15�:14
/**************************************/
void SetDot_FS(unsigned char x,unsigned char y,unsigned char color)
{
    unsigned char  pos ,bx,temp=0;

    if(x>127||y>31)return;//超出范围

    pos=y/8;

    bx=y%8;

    temp=1<<(bx);

    if(color==1)OLED_GRAM[x][pos]|=temp;

    else OLED_GRAM[x][pos]&=~temp;
}

/**************************************/
/**************************************/
//基于内存修改的系列函数
//全屏画图：将点阵数据填充到屏幕上
//							
//						可以加个中断函数，进行定时刷新，保持帧率
//							
//边学编写；2016/9/24/16:07
/**************************************/
void OLED_Screen_display(void)
{
    unsigned char  m=0,n=0;

    for (m=0;m<4;m++){			//一直没解决的只花上半部分不画下半部分的问题在加了花括号后解决了，以后要规范写程序
        OLED_WR_Byte(0xb0+m, OLED_CMD);	//page0-page1
        OLED_WR_Byte(0x00, OLED_CMD);		//low column start address
        OLED_WR_Byte(0x10, OLED_CMD);		//high column start address
        for(n=0;n<128;n++)
        {
            OLED_WR_Byte(OLED_GRAM[n][m], OLED_DATA);
        }

    }
}



/**************************************/
/**************************************/
//基于内存修改的系列函数
//清屏
//							
//						
//							
//边学编写；2017/1/04/20:45
/**************************************/
void OLED_CLS_SF(void)//清屏
{unsigned char  m,n;
    for(m=0;m<128;m++)
        for(n=0;n<4;n++)
            OLED_GRAM[m][n]=0;
}
/**************************************/
/**************************************/
//基于内存修改的系列函数
//部分清屏
//							
//						
//							
//边学编写；2017/1/04/20:45
/**************************************/
void OLED_PART_CLS_SF(unsigned char x,unsigned char y,unsigned char lengh,unsigned char  wide,unsigned char color)
{
    Draw_Box_FS(x,y,lengh,wide,1,color);
}

/**************************************/
/**************************************/
//基于内存修改的系列函数
//画圆函数1：
//							
//						
//							
//边学编写；2016/9/24/16:54
/**************************************/
void OLED_Draw_circle_SF(unsigned char x,unsigned char y,unsigned char r,unsigned char color )
{
    unsigned char i;
    for(i=x-r;i<x+r+1;i++)
    {
        SetDot_FS(i,y-sqrt(r*r-(x-i)*(x-i)),color);
        SetDot_FS(i,y+sqrt(r*r-(x-i)*(x-i)),color);
    }
}
/**************************************/
//基于内存修改的系列函数
//画圆函数1：
//							
//						
//							
//边学编写；2016/9/24/16:54
/**************************************/
void OLED_Draw_circle2_SF(unsigned char x0,unsigned char y0,unsigned char r,unsigned char color)
{
    int a,b;
    int di;
    a=0;
    b=r;
    di=3-2*r;             //??????????
    while(a<=b)
    {
        SetDot_FS(x0-b,y0-a,color);             //3
        SetDot_FS(x0+b,y0-a,color);             //0
        SetDot_FS(x0-a,y0+b,color);             //1
        SetDot_FS(x0-b,y0-a,color);             //7
        SetDot_FS(x0-a,y0-b,color);             //2
        SetDot_FS(x0+b,y0+a,color);             //4
        SetDot_FS(x0+a,y0-b,color);             //5
        SetDot_FS(x0+a,y0+b,color);             //6
        SetDot_FS(x0-b,y0+a,color);
        a++;

        if(di<0)
            di +=4*a+6;
        else
        {
            di +=10+4*(a-b);
            b--;
        }
        SetDot_FS(x0+a,y0+b,color);
    }
}


/***********************划横线******************/
void hline(unsigned char x,unsigned char y,unsigned char length,unsigned char color )
{
    unsigned char a,b;

    if(x > 127){
        x = 0;
    }
    if(y > 64){
        y = 0;
    }
    for(a = 0; a < length; a++){
        b = a + x;
        SetDot_FS(b, y, color);
    }
}


/***********************画竖线******************/
void shuline(unsigned char x,unsigned char y,unsigned char length,unsigned char color )
{	unsigned char a,b;

    if(x > 127){
        x = 0;
    }
    if(y > 64){
        y = 0;
    }
    for(a = 0; a < length; a++){
        b = y + a;
        SetDot_FS(x,b,color);
    }
}

/**************************************/
//基于内存修改的系列函数
//任意画线函数   x0,y0 :起点坐标    x1,y1:终点坐标
//							
//		转自51单片机的12864程序
//							
//边学编写；2016/9/24/16:54
/**************************************/
void OLED_Line_SF(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color)
{
    int temp;
    int dx,dy;
    int s1,s2,status,i;
    int Dx,Dy,sub;

    dx = x1 - x0;
    if(dx >= 0){
        s1 = 1;
    }else{
        s1 = -1;
    }
    dy = y1 - y0;
    if(dy >= 0){
        s2 = 1;
    }else{
        s2 = -1;
    }
    Dx = fabs(x1 - x0);
    Dy = fabs(y1 - y0);
    if(Dy > Dx){
        temp = Dx;
        Dx = Dy;
        Dy = temp;
        status = 1;
    }else{
        status = 0;
    }

    if(dx == 0){
        hline(x0, y0, y1-y0, color);
    }
    if(dy == 0){
        shuline(x0, y0, x1-x0, color);
    }

    sub = 2*Dy - Dx;
    for(i = 0; i < Dx; i++){
        SetDot_FS(x0, y0, color);
        if(sub >= 0){
            if(status == 1){
                x0 += s1;
            }else{
                y0 += s2;
            }
            sub -= 2*Dx;
        }
        if(status == 1){
            y0 += s2;
        }else{
            x0 += s1;
        }
        sub += 2*Dy;
    }
}
/**************************************/
//基于内存修改的系列函数
//全屏画图：画方框     共六个参数
//							full: 	0:画框		1：画方块
//							cahng :x轴上的长度		kuan :y轴上的长度
//							
//边学编写；2016/9/24/16:07
/**************************************/
void  Draw_Box_FS(unsigned char x,unsigned char y,unsigned char chang,unsigned char kuan,unsigned char full,unsigned char color)
{
    unsigned char i,n;

    hline(x, y, chang, color);
    hline(x, y+kuan, chang, color);
    shuline(x, y, kuan, color);
    shuline(x + chang, y, kuan, color);
    if(full == 1){
        for(i = x; i < chang + x; i++){
            for(n = y; n < y + kuan; n++)
            {
                SetDot_FS(i, n, color);		//此处可以优化为直接操作数组的形式
            }
        }
    }

}


//--------------------------------------------------------------
// Prototype      : void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
// Calls          : 
// Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); ch[] -- 要显示的字符串;
//									TextSize -- 字符大小(1:6*8 ; 2:8*16)
//	example:		 OLED_ShowStr_SF(0,20,&"abc123123",1);   //记得输出的字符前加个&和“”
// Description    : 显示codetab.h中的ASCII字符,有6*8和8*16可选择
//--------------------------------------------------------------
void OLED_ShowStr_SF(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
    unsigned char c = 0, i = 0, j = 0;
    switch(TextSize)
    {
        case 1:
        {
            while(ch[j] != '\0'){
                c = ch[j] - 32;
                if(x > 126){
                    x = 0;
                    y++;
                }
                //OLED_SetPos(x,y);
                for(i = 0; i < 6; i++)
                    OLED_GRAM[x + i][y / 8] |= (F6x8[c][i]);
                x += 6;
                j++;
            }
        }
        break;

        case 2:
        {
            while(ch[j] != '\0'){
                c = ch[j] - 32;
                if(x > 120){
                    x = 0;
                    y++;
                }
                //OLED_SetPos(x,y);
                for(i=0;i<8;i++){
                    OLED_GRAM[x+i][y/8]|=(F8X16[c*16+i]);
                }
                //OLED_SetPos(x,y+1);
                for(i=0;i<8;i++){
                    OLED_GRAM[x+i][y/8+1]|=(F8X16[c*16+i+8]);
                }
                //WriteDat(F8X16[c*16+i+8]);
                x += 8;
                j++;
            }
        }
        break;
    }
}

//--------------------------------------------------------------
// Prototype      : void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
// Calls          : 
// Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在codetab.h中的索引
// Description    : 显示codetab.h中的汉字,16*16点阵
//--------------------------------------------------------------
void OLED_ShowCN_SF(unsigned char x, unsigned char y, unsigned char N)
{
    unsigned char wm = 0;
    unsigned int  adder = 32*N;

    for(wm = 0;wm < 16;wm++)
    {
        OLED_GRAM[x+wm][y/8] |= (F16x16[adder+wm]);
    }
    for(wm = 0;wm < 16;wm++)
    {
        OLED_GRAM[x+wm][y/8+1] |= (F16x16[adder+16+wm]);

    }
}

//--------------------------------------------------------------
// Prototype      : void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);
// Calls          : 
// Parameters     : x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
// Description    : 显示BMP位图
//--------------------------------------------------------------
void OLED_DrawBMP_SF(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,const unsigned char BMP[])
{
    unsigned int j=0;
    unsigned char x, y;

    for(y = y0; y < y1; y++){
        for(x = x0; x < x1; x++){
            OLED_GRAM[x][y] = (BMP[j++]);
        }
    }
}

